package com.fowo.api.config;

import cn.hutool.core.util.StrUtil;
import lombok.Data;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.net.MalformedURLException;
import java.net.URL;
import java.time.Duration;

/**
 * 常规应用配置属性
 */
@Data
@ConfigurationProperties(prefix = "app")
public class AppProperties implements InitializingBean {
    /**
     * 当前服务节点唯一标识
     */
    private String workerId = "default";

    /**
     * 应用前端访问地址，相关前端地址生成会使用此值组成
     */
    private URL hostUrl;


    /**
     * oss地址
     */
    private String sysFilePreivewUrlPrefix;

    @Override
    public void afterPropertiesSet() throws Exception {
        if (StrUtil.isBlank(sysFilePreivewUrlPrefix)) {
            throw new Exception("必须提供 app.sys-file-preivew-url-prefix 配置！");
        }
    }
    /**
     * 登录图片验证码检查模式
     */
    private LoginImageCaptchaCheckMode loginImageCaptchaCheckMode = LoginImageCaptchaCheckMode.Required;

    /**
     * Token 有效时间（没有勾记住我）
     */
    private Duration tokenExpiration = Duration.ofMinutes(30);

    /**
     * Token 有效时间（勾了记住我）
     */
    private Duration memberMeTokenExpiration = Duration.ofDays(7);

    /**
     * 发生帐号锁定的连续登录失败次数（默认为 3 次）
     */
    private int loginFailLockCount = 3;

    /**
     * 计为连续失败的间隔时间（默认为 30 秒）
     */
    private Duration loginFailCountInterval = Duration.ofSeconds(30);

    /**
     * 连续登录失败帐号锁定时长（默认为 5 分钟）
     */
    private Duration loginFailLockDuration = Duration.ofMinutes(5);

    public String addHostUriToPath(String path) {
        if (hostUrl != null) {
            try {
                return new URL(hostUrl, path).toString();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
        return path;
    }

    /**
     * 登录图片验证码检查模式
     */
    public enum LoginImageCaptchaCheckMode {
        /**
         * 禁用图片验证码检查
         */
        Disable,
        /**
         * 当提供了 checkKey 时检查，未提供时跳过
         */
        Auto,
        /**
         * 必须检查
         */
        Required
    }
}
